#ifndef SWITCHSLIDERWIDGET_H
#define SWITCHSLIDERWIDGET_H

#include <QWidget>              // 基础窗口部件类
#include <QColor>               // 颜色类，用于控件颜色设置
#include <QPropertyAnimation>   // 属性动画类，用于滑块动画效果

/**
 * @brief 自定义开关滑块控件类
 * 实现类似移动端的开关效果，包含平滑过渡动画和交互反馈
 */
class SwitchSliderWidget : public QWidget
{
    Q_OBJECT
    // 声明滑块位置属性，用于动画控制
    Q_PROPERTY(int sliderPosition READ sliderPosition WRITE setSliderPosition)
    // 声明背景颜色属性，用于颜色过渡动画
    Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor)

public:
    /**
     * @brief 构造函数
     * @param parent 父窗口指针
     */
    explicit SwitchSliderWidget(QWidget *parent = nullptr);

    /**
     * @brief 获取当前开关状态
     * @return 若开关打开返回true，否则返回false
     */
    bool isChecked() const;

    /**
     * @brief 设置开关状态
     * @param checked 目标状态（true为打开，false为关闭）
     * @param animate 是否启用过渡动画
     */
    void setChecked(bool checked, bool animate = true);

    /**
     * @brief 获取当前滑块位置
     * @return 滑块X轴位置
     */
    int sliderPosition() const;

    /**
     * @brief 设置滑块位置
     * @param position 目标位置
     */
    void setSliderPosition(int position);

    /**
     * @brief 获取当前背景颜色
     * @return 背景颜色对象
     */
    QColor backgroundColor() const;

    /**
     * @brief 设置背景颜色
     * @param color 目标颜色
     */
    void setBackgroundColor(const QColor &color);

    /**
     * @brief 设置控件尺寸
     * @param width 宽度
     * @param height 高度
     */
    void setSwitchSize(int width, int height);

signals:
    /**
     * @brief 开关状态变化时触发的信号
     * @param checked 变化后的状态
     */
    void toggled(bool checked);

    /**
     * @brief 控件被点击时触发的信号
     */
    void clicked();

protected:
    /**
     * @brief 重绘事件，用于绘制控件外观
     * @param event 事件对象
     */
    void paintEvent(QPaintEvent *event) override;

    /**
     * @brief 鼠标按下事件，处理点击交互
     * @param event 事件对象
     */
    void mousePressEvent(QMouseEvent *event) override;

    /**
     * @brief 鼠标释放事件，处理状态切换
     * @param event 事件对象
     */
    void mouseReleaseEvent(QMouseEvent *event) override;

    /**
     * @brief 键盘按下事件，支持空格键控制
     * @param event 事件对象
     */
    void keyPressEvent(QKeyEvent *event) override;

    /**
     * @brief 提供控件的建议尺寸
     * @return 建议尺寸对象
     */
    QSize sizeHint() const override;

private:
    bool m_checked;                     // 开关状态（true为打开）
    int m_sliderPosition;               // 滑块当前位置
    QColor m_backgroundColor;           // 当前背景颜色
    bool m_pressed;                     // 鼠标是否按下
    QPropertyAnimation *m_animation;    // 滑块动画对象

    // 控件样式配置参数
    int m_width;                        // 控件宽度
    int m_height;                       // 控件高度
    int m_sliderRadius;                 // 滑块半径
    QColor m_checkedColor;              // 打开状态的背景色
    QColor m_uncheckedColor;            // 关闭状态的背景色

    /**
     * @brief 计算滑块最大位置（右侧极限位置）
     * @return 最大位置值
     */
    int maxSliderPosition() const;
};

#endif // SWITCHSLIDERWIDGET_H

